package com.sxjh.common;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Generator {

  public static void main(String[] args) {
    // 全局配置
    String projectPath = System.getProperty("user.dir");
    GlobalConfig gc = new GlobalConfig()
//                .setOutputDir(projectPath +"/"+ scanner("请输入模块名称") + "/src/main/java")
            .setOutputDir(projectPath + "/src/main/java")
            .setAuthor("zixin")
            .setOpen(false)
            .setOpen(false)
            // 是否开启swagger2注解
            .setSwagger2(true)
            // 开启ActiveRecord（实例类继承Model类实现直接CURD操作）
            // .setActiveRecord(true)
            // 主键ID的生成类型
            .setIdType(IdType.AUTO)
            // 开启BaseResultMap
            .setBaseResultMap(true)
            // 开启baseColumnList
            .setBaseColumnList(true)
            // 是否覆盖已有文件
//                 .setFileOverride(true)
            // 设置文件名称
            .setControllerName("%sController")
            .setServiceImplName("%sServiceImpl")
            .setServiceName("%sService")
            .setMapperName("%sMapper")
            .setXmlName("%sMapper")
            .setEntityName("%s");

    // 数据源配置
    DataSourceConfig dsc = new DataSourceConfig()
            .setUrl("jdbc:mysql://localhost:3306/sxjh?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true")
            .setDriverName("com.mysql.cj.jdbc.Driver")
            .setUsername("root")
            .setPassword("root");

    // 包配置
    PackageConfig pc = new PackageConfig()
//                .setModuleName(scanner("请输入包名"))
//            .setModuleName("api")
            .setParent("com.sxjh");

    // 模板配置
    TemplateConfig tc = new TemplateConfig();
//            .setEntity("templates/entity.java")
//            .setMapper("templates/mapper.java")
//            .setXml("templates/mapper.xml")
//            .setService("templates/service.java")
//            .setServiceImpl("templates/serviceImpl.java")
//            .setController("templates/controller.java");

    List<TableFill> tableFills = new ArrayList<>();
    tableFills.add(new TableFill("created_at", FieldFill.INSERT));
    tableFills.add(new TableFill("updated_at", FieldFill.UPDATE));

    // 策略配置
    StrategyConfig sc = new StrategyConfig()
            .setNaming(NamingStrategy.underline_to_camel)
            .setColumnNaming(NamingStrategy.underline_to_camel)
            .setEntityLombokModel(true)
            .setControllerMappingHyphenStyle(true)
            .setRestControllerStyle(true)
            .setEntityTableFieldAnnotationEnable(true)
            // 去掉表前缀
            .setTablePrefix("sys_", "bd_", "qa_", "it_", "pub_", "cb_", "ht_")
            // 自动填充，创建时间or更新时间
            .setTableFillList(tableFills)
            // 去掉字段前缀
            // .setFieldPrefix()
            .setInclude(scanner("表名，多个英文逗号分割").split(","));

    // 添加配置信息并执行
    // 代码生成器
    new AutoGenerator()
            .setGlobalConfig(gc)
            .setDataSource(dsc)
            .setPackageInfo(pc)
            .setTemplate(tc)
            .setStrategy(sc)
            .setStrategy(sc)
            .execute();
  }

  /**
   * <p>
   * 读取控制台内容
   * </p>
   */
  public static String scanner(String tip) {
    Scanner scanner = new Scanner(System.in);
    String help = "请输入" + tip + "：";
    System.out.println(help);
    if (scanner.hasNext()) {
      String ipt = scanner.next();
      if (StrUtil.isNotBlank(ipt)) {
        return ipt;
      }
    }
    throw new MybatisPlusException("请输入正确的" + tip + "！");
  }

}
